{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<center>\n",
    "    <p style=\"text-align:center\">\n",
    "        <img alt=\"phoenix logo\" src=\"https://storage.googleapis.com/arize-phoenix-assets/assets/phoenix-logo-light.svg\" width=\"200\"/>\n",
    "        <br>\n",
    "        <a href=\"https://arize.com/docs/phoenix/\">Docs</a>\n",
    "        |\n",
    "        <a href=\"https://github.com/Arize-ai/phoenix\">GitHub</a>\n",
    "        |\n",
    "        <a href=\"https://arize-ai.slack.com/join/shared_invite/zt-2w57bhem8-hq24MB6u7yE_ZF_ilOYSBw#/shared-invite/email\">Community</a>\n",
    "    </p>\n",
    "</center>\n",
    "<h1 align=\"center\">Retrieval Relevance Evals</h1>\n",
    "\n",
    "Arize provides tooling to evaluate LLM applications, including tools to determine the relevance or irrelevance of documents retrieved by retrieval-augmented generation (RAG) applications. This relevance is then used to measure the quality of each retrieval using ranking metrics such as precision@k. In order to determine whether each retrieved document is relevant or irrelevant to the corresponding query, our approach is straightforward: ask an LLM.\n",
    "\n",
    "The purpose of this notebook is:\n",
    "\n",
    "- to evaluate the performance of an LLM-assisted approach to relevance classification against information retrieval datasets with ground-truth relevance labels,\n",
    "- to provide an experimental framework for users to iterate and improve on the default classification template.\n",
    "\n",
    "## Install Dependencies and Import Libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "#####################\n",
    "## N_EVAL_SAMPLE_SIZE\n",
    "#####################\n",
    "# Eval sample size determines the run time\n",
    "# 100 samples: GPT-4 ~ 80 sec / GPT-3.5 ~ 40 sec\n",
    "# 1,000 samples: GPT-4 ~15-17 min / GPT-3.5 ~ 6-7min (depending on retries)\n",
    "# 10,000 samples GPT-4 ~170 min / GPT-3.5 ~ 70min\n",
    "N_EVAL_SAMPLE_SIZE = 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "9391.10s - pydevd: Sending message related to process being replaced timed-out after 5 seconds\n"
     ]
    }
   ],
   "source": [
    "!pip install -qq \"arize-phoenix-evals>=0.0.5\" \"openai>=1\" ipython matplotlib pycm scikit-learn tiktoken nest_asyncio 'httpx<0.28'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ℹ️ To enable async request submission in notebook environments like Jupyter or Google Colab, optionally use `nest_asyncio`. `nest_asyncio` globally patches `asyncio` to enable event loops to be re-entrant. This is not required for non-notebook environments.\n",
    "\n",
    "Without `nest_asyncio`, eval submission can be much slower, depending on your organization's rate limits. Speed increases of about 5x are typical."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "import nest_asyncio\n",
    "\n",
    "nest_asyncio.apply()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "from getpass import getpass\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "from pycm import ConfusionMatrix\n",
    "from sklearn.metrics import classification_report\n",
    "\n",
    "from phoenix.evals import (\n",
    "    RAG_RELEVANCY_PROMPT_RAILS_MAP,\n",
    "    RAG_RELEVANCY_PROMPT_TEMPLATE,\n",
    "    OpenAIModel,\n",
    "    download_benchmark_dataset,\n",
    "    llm_classify,\n",
    ")\n",
    "\n",
    "pd.set_option(\"display.max_colwidth\", None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Download Benchmark Dataset\n",
    "\n",
    "We'll evaluate the evaluation system consisting of an LLM model and settings in addition to an evaluation prompt template against benchmark datasets of queries and retrieved documents with ground-truth relevance labels. Currently supported datasets include:\n",
    "\n",
    "- \"wiki_qa-train\"\n",
    "- \"ms_marco-v1.1-train\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>query_id</th>\n",
       "      <th>query_text</th>\n",
       "      <th>document_title</th>\n",
       "      <th>document_text</th>\n",
       "      <th>document_text_with_emphasis</th>\n",
       "      <th>relevant</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Q1</td>\n",
       "      <td>how are glacier caves formed?</td>\n",
       "      <td>Glacier cave</td>\n",
       "      <td>A partly submerged glacier cave on Perito Moreno Glacier . The ice facade is approximately 60 m high Ice formations in the Titlis glacier cave A glacier cave is a cave formed within the ice of a glacier . Glacier caves are often called ice caves , but this term is properly used to describe bedrock caves that contain year-round ice.</td>\n",
       "      <td>A partly submerged glacier cave on Perito Moreno Glacier . The ice facade is approximately 60 m high Ice formations in the Titlis glacier cave A GLACIER CAVE IS A CAVE FORMED WITHIN THE ICE OF A GLACIER . Glacier caves are often called ice caves , but this term is properly used to describe bedrock caves that contain year-round ice.</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Q10</td>\n",
       "      <td>how an outdoor wood boiler works</td>\n",
       "      <td>Outdoor wood-fired boiler</td>\n",
       "      <td>The outdoor wood boiler is a variant of the classic wood stove adapted for set-up outdoors while still transferring the heat to interior buildings.</td>\n",
       "      <td>The outdoor wood boiler is a variant of the classic wood stove adapted for set-up outdoors while still transferring the heat to interior buildings.</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Q100</td>\n",
       "      <td>what happens  to the light independent reactions of photosynthesis?</td>\n",
       "      <td>Light-independent reactions</td>\n",
       "      <td>The simplified internal structure of a chloroplast Overview of the Calvin cycle and carbon fixation The light-independent reactions of photosynthesis are chemical reactions that convert carbon dioxide and other compounds into glucose . These reactions occur in the stroma , the fluid-filled area of a chloroplast outside of the thylakoid membranes. These reactions take the light-dependent reactions and perform further chemical processes on them. There are three phases to the light-independent reactions, collectively called the Calvin cycle : carbon fixation, reduction reactions, and ribulose 1,5-bisphosphate (RuBP) regeneration. Despite its name, this process occurs only when light is available. Plants do not carry out the Calvin cycle by night. They, instead, release sucrose into the phloem from their starch reserves. This process happens when light is available independent of the kind of photosynthesis ( C3 carbon fixation , C4 carbon fixation , and Crassulacean Acid Metabolism ); CAM plants store malic acid in their vacuoles every night and release it by day in order to make this process work.</td>\n",
       "      <td>The simplified internal structure of a chloroplast Overview of the Calvin cycle and carbon fixation THE LIGHT-INDEPENDENT REACTIONS OF PHOTOSYNTHESIS ARE CHEMICAL REACTIONS THAT CONVERT CARBON DIOXIDE AND OTHER COMPOUNDS INTO GLUCOSE . These reactions occur in the stroma , the fluid-filled area of a chloroplast outside of the thylakoid membranes. THESE REACTIONS TAKE THE LIGHT-DEPENDENT REACTIONS AND PERFORM FURTHER CHEMICAL PROCESSES ON THEM. There are three phases to the light-independent reactions, collectively called the Calvin cycle : carbon fixation, reduction reactions, and ribulose 1,5-bisphosphate (RuBP) regeneration. Despite its name, this process occurs only when light is available. Plants do not carry out the Calvin cycle by night. They, instead, release sucrose into the phloem from their starch reserves. This process happens when light is available independent of the kind of photosynthesis ( C3 carbon fixation , C4 carbon fixation , and Crassulacean Acid Metabolism ); CAM plants store malic acid in their vacuoles every night and release it by day in order to make this process work.</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Q1000</td>\n",
       "      <td>where in the bible that palestine have no land in jerusalem</td>\n",
       "      <td>Philistines</td>\n",
       "      <td>The Philistine cities of Gaza, Ashdod, Ashkelon, Ekron, and Gath The Philistines (, , , or ; , Plištim), Pleshet or Peleset, were a people who as part of the Sea Peoples appeared in the southern coastal area of Canaan at the beginning of the Iron Age (circa 1175 BC), most probably from the Aegean region. According to the Bible , they ruled the five city-states (the \"Philistine Pentapolis\") of Gaza , Ashkelon , Ashdod , Ekron and Gath , from Wadi Gaza in the south to the Yarqon River in the north, but with no fixed border to the east. The Bible paints them as the Kingdom of Israel 's most dangerous enemy. Originating somewhere in the Aegean , their population was around 25,000 in the 12th century BC, rising to a peak of 30,000 in the 11th century BC, of which the Aegean element was not more than half the total, and perhaps much less. Nothing is known for certain about the original language or languages of the Philistines, however they were not part of the Semitic Canaanite population. There is some limited evidence in favour of the assumption that the Philistines were Indo-European-speakers either from Greece and/or Luwian speakers from the coast of Asia Minor . Philistine-related words found in the Bible are not Semitic, and can in some cases, with reservations, be traced back to Proto-Indo-European roots. By the beginning of the 1st Millennium BCE they had adopted the general Canaanite language of the region.</td>\n",
       "      <td>The Philistine cities of Gaza, Ashdod, Ashkelon, Ekron, and Gath The Philistines (, , , or ; , Plištim), Pleshet or Peleset, were a people who as part of the Sea Peoples appeared in the southern coastal area of Canaan at the beginning of the Iron Age (circa 1175 BC), most probably from the Aegean region. According to the Bible , they ruled the five city-states (the \"Philistine Pentapolis\") of Gaza , Ashkelon , Ashdod , Ekron and Gath , from Wadi Gaza in the south to the Yarqon River in the north, but with no fixed border to the east. The Bible paints them as the Kingdom of Israel 's most dangerous enemy. Originating somewhere in the Aegean , their population was around 25,000 in the 12th century BC, rising to a peak of 30,000 in the 11th century BC, of which the Aegean element was not more than half the total, and perhaps much less. Nothing is known for certain about the original language or languages of the Philistines, however they were not part of the Semitic Canaanite population. There is some limited evidence in favour of the assumption that the Philistines were Indo-European-speakers either from Greece and/or Luwian speakers from the coast of Asia Minor . Philistine-related words found in the Bible are not Semitic, and can in some cases, with reservations, be traced back to Proto-Indo-European roots. By the beginning of the 1st Millennium BCE they had adopted the general Canaanite language of the region.</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Q1001</td>\n",
       "      <td>what are the test scores on asvab</td>\n",
       "      <td>Armed Services Vocational Aptitude Battery</td>\n",
       "      <td>The Armed Services Vocational Aptitude Battery (ASVAB) is a multiple choice test, administered by the United States Military Entrance Processing Command , used to determine qualification for enlistment in the United States armed forces . It is often offered to American high school students when they are in the 10th, 11th and 12th grade, though anyone eligible for enlistment may take it. Although the test is administered by the military, it is not (and never has been) a requirement that a test-taker with a qualifying score enlist in the armed forces.</td>\n",
       "      <td>The Armed Services Vocational Aptitude Battery (ASVAB) is a multiple choice test, administered by the United States Military Entrance Processing Command , used to determine qualification for enlistment in the United States armed forces . It is often offered to American high school students when they are in the 10th, 11th and 12th grade, though anyone eligible for enlistment may take it. Although the test is administered by the military, it is not (and never has been) a requirement that a test-taker with a qualifying score enlist in the armed forces.</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  query_id  \\\n",
       "0       Q1   \n",
       "1      Q10   \n",
       "2     Q100   \n",
       "3    Q1000   \n",
       "4    Q1001   \n",
       "\n",
       "                                                            query_text  \\\n",
       "0                                        how are glacier caves formed?   \n",
       "1                                     how an outdoor wood boiler works   \n",
       "2  what happens  to the light independent reactions of photosynthesis?   \n",
       "3          where in the bible that palestine have no land in jerusalem   \n",
       "4                                    what are the test scores on asvab   \n",
       "\n",
       "                               document_title  \\\n",
       "0                                Glacier cave   \n",
       "1                   Outdoor wood-fired boiler   \n",
       "2                 Light-independent reactions   \n",
       "3                                 Philistines   \n",
       "4  Armed Services Vocational Aptitude Battery   \n",
       "\n",
       "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               document_text  \\\n",
       "0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              A partly submerged glacier cave on Perito Moreno Glacier . The ice facade is approximately 60 m high Ice formations in the Titlis glacier cave A glacier cave is a cave formed within the ice of a glacier . Glacier caves are often called ice caves , but this term is properly used to describe bedrock caves that contain year-round ice.   \n",
       "1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        The outdoor wood boiler is a variant of the classic wood stove adapted for set-up outdoors while still transferring the heat to interior buildings.   \n",
       "2                                                                                                                                                                                                                                                                                                                                    The simplified internal structure of a chloroplast Overview of the Calvin cycle and carbon fixation The light-independent reactions of photosynthesis are chemical reactions that convert carbon dioxide and other compounds into glucose . These reactions occur in the stroma , the fluid-filled area of a chloroplast outside of the thylakoid membranes. These reactions take the light-dependent reactions and perform further chemical processes on them. There are three phases to the light-independent reactions, collectively called the Calvin cycle : carbon fixation, reduction reactions, and ribulose 1,5-bisphosphate (RuBP) regeneration. Despite its name, this process occurs only when light is available. Plants do not carry out the Calvin cycle by night. They, instead, release sucrose into the phloem from their starch reserves. This process happens when light is available independent of the kind of photosynthesis ( C3 carbon fixation , C4 carbon fixation , and Crassulacean Acid Metabolism ); CAM plants store malic acid in their vacuoles every night and release it by day in order to make this process work.   \n",
       "3  The Philistine cities of Gaza, Ashdod, Ashkelon, Ekron, and Gath The Philistines (, , , or ; , Plištim), Pleshet or Peleset, were a people who as part of the Sea Peoples appeared in the southern coastal area of Canaan at the beginning of the Iron Age (circa 1175 BC), most probably from the Aegean region. According to the Bible , they ruled the five city-states (the \"Philistine Pentapolis\") of Gaza , Ashkelon , Ashdod , Ekron and Gath , from Wadi Gaza in the south to the Yarqon River in the north, but with no fixed border to the east. The Bible paints them as the Kingdom of Israel 's most dangerous enemy. Originating somewhere in the Aegean , their population was around 25,000 in the 12th century BC, rising to a peak of 30,000 in the 11th century BC, of which the Aegean element was not more than half the total, and perhaps much less. Nothing is known for certain about the original language or languages of the Philistines, however they were not part of the Semitic Canaanite population. There is some limited evidence in favour of the assumption that the Philistines were Indo-European-speakers either from Greece and/or Luwian speakers from the coast of Asia Minor . Philistine-related words found in the Bible are not Semitic, and can in some cases, with reservations, be traced back to Proto-Indo-European roots. By the beginning of the 1st Millennium BCE they had adopted the general Canaanite language of the region.   \n",
       "4                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                The Armed Services Vocational Aptitude Battery (ASVAB) is a multiple choice test, administered by the United States Military Entrance Processing Command , used to determine qualification for enlistment in the United States armed forces . It is often offered to American high school students when they are in the 10th, 11th and 12th grade, though anyone eligible for enlistment may take it. Although the test is administered by the military, it is not (and never has been) a requirement that a test-taker with a qualifying score enlist in the armed forces.   \n",
       "\n",
       "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 document_text_with_emphasis  \\\n",
       "0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              A partly submerged glacier cave on Perito Moreno Glacier . The ice facade is approximately 60 m high Ice formations in the Titlis glacier cave A GLACIER CAVE IS A CAVE FORMED WITHIN THE ICE OF A GLACIER . Glacier caves are often called ice caves , but this term is properly used to describe bedrock caves that contain year-round ice.   \n",
       "1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        The outdoor wood boiler is a variant of the classic wood stove adapted for set-up outdoors while still transferring the heat to interior buildings.   \n",
       "2                                                                                                                                                                                                                                                                                                                                    The simplified internal structure of a chloroplast Overview of the Calvin cycle and carbon fixation THE LIGHT-INDEPENDENT REACTIONS OF PHOTOSYNTHESIS ARE CHEMICAL REACTIONS THAT CONVERT CARBON DIOXIDE AND OTHER COMPOUNDS INTO GLUCOSE . These reactions occur in the stroma , the fluid-filled area of a chloroplast outside of the thylakoid membranes. THESE REACTIONS TAKE THE LIGHT-DEPENDENT REACTIONS AND PERFORM FURTHER CHEMICAL PROCESSES ON THEM. There are three phases to the light-independent reactions, collectively called the Calvin cycle : carbon fixation, reduction reactions, and ribulose 1,5-bisphosphate (RuBP) regeneration. Despite its name, this process occurs only when light is available. Plants do not carry out the Calvin cycle by night. They, instead, release sucrose into the phloem from their starch reserves. This process happens when light is available independent of the kind of photosynthesis ( C3 carbon fixation , C4 carbon fixation , and Crassulacean Acid Metabolism ); CAM plants store malic acid in their vacuoles every night and release it by day in order to make this process work.   \n",
       "3  The Philistine cities of Gaza, Ashdod, Ashkelon, Ekron, and Gath The Philistines (, , , or ; , Plištim), Pleshet or Peleset, were a people who as part of the Sea Peoples appeared in the southern coastal area of Canaan at the beginning of the Iron Age (circa 1175 BC), most probably from the Aegean region. According to the Bible , they ruled the five city-states (the \"Philistine Pentapolis\") of Gaza , Ashkelon , Ashdod , Ekron and Gath , from Wadi Gaza in the south to the Yarqon River in the north, but with no fixed border to the east. The Bible paints them as the Kingdom of Israel 's most dangerous enemy. Originating somewhere in the Aegean , their population was around 25,000 in the 12th century BC, rising to a peak of 30,000 in the 11th century BC, of which the Aegean element was not more than half the total, and perhaps much less. Nothing is known for certain about the original language or languages of the Philistines, however they were not part of the Semitic Canaanite population. There is some limited evidence in favour of the assumption that the Philistines were Indo-European-speakers either from Greece and/or Luwian speakers from the coast of Asia Minor . Philistine-related words found in the Bible are not Semitic, and can in some cases, with reservations, be traced back to Proto-Indo-European roots. By the beginning of the 1st Millennium BCE they had adopted the general Canaanite language of the region.   \n",
       "4                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                The Armed Services Vocational Aptitude Battery (ASVAB) is a multiple choice test, administered by the United States Military Entrance Processing Command , used to determine qualification for enlistment in the United States armed forces . It is often offered to American high school students when they are in the 10th, 11th and 12th grade, though anyone eligible for enlistment may take it. Although the test is administered by the military, it is not (and never has been) a requirement that a test-taker with a qualifying score enlist in the armed forces.   \n",
       "\n",
       "   relevant  \n",
       "0      True  \n",
       "1     False  \n",
       "2      True  \n",
       "3     False  \n",
       "4     False  "
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = download_benchmark_dataset(\n",
    "    task=\"binary-relevance-classification\", dataset_name=\"wiki_qa-train\"\n",
    ")\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Display Binary Relevance Classification Template\n",
    "\n",
    "View the default template used to classify relevance. You can tweak this template and evaluate its performance relative to the default."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "You are comparing a reference text to a question and trying to determine if the reference text\n",
      "contains information relevant to answering the question. Here is the data:\n",
      "    [BEGIN DATA]\n",
      "    ************\n",
      "    [Question]: {input}\n",
      "    ************\n",
      "    [Reference text]: {reference}\n",
      "    ************\n",
      "    [END DATA]\n",
      "Compare the Question above to the Reference text. You must determine whether the Reference text\n",
      "contains information that can answer the Question. Please focus on whether the very specific\n",
      "question can be answered by the information in the Reference text.\n",
      "Your response must be single word, either \"relevant\" or \"unrelated\",\n",
      "and should not contain any text or characters aside from that word.\n",
      "\"unrelated\" means that the reference text does not contain an answer to the Question.\n",
      "\"relevant\" means the reference text contains an answer to the Question.\n"
     ]
    }
   ],
   "source": [
    "print(RAG_RELEVANCY_PROMPT_TEMPLATE)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The template variables are:\n",
    "\n",
    "- **input:** the question asked by a user\n",
    "- **reference:** the text of the retrieved document\n",
    "- **output:** a ground-truth relevance label"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Configure the LLM\n",
    "\n",
    "Configure your OpenAI API key."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "if not (openai_api_key := os.getenv(\"OPENAI_API_KEY\")):\n",
    "    openai_api_key = getpass(\"🔑 Enter your OpenAI API key: \")\n",
    "os.environ[\"OPENAI_API_KEY\"] = openai_api_key"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Benchmark Dataset Sample\n",
    "Sample size determines run time\n",
    "Recommend iterating small: 100 samples\n",
    "Then increasing to large test set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_sample = df.sample(n=N_EVAL_SAMPLE_SIZE).reset_index(drop=True)\n",
    "df_sample = df_sample.rename(\n",
    "    columns={\n",
    "        \"query_text\": \"input\",\n",
    "        \"document_text\": \"reference\",\n",
    "    },\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LLM Evals: Retrieval Relevance Classifications GPT-4\n",
    "Run relevance against a subset of the data.\n",
    "Instantiate the LLM and set parameters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The `model_name` field is deprecated. Use `model` instead.                 This will be removed in a future release.\n"
     ]
    }
   ],
   "source": [
    "model = OpenAIModel(\n",
    "    model_name=\"gpt-4\",\n",
    "    temperature=0.0,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"Hello! I'm working perfectly. How can I assist you today?\""
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model(\"Hello world, this is a test if you are working?\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Run Relevance Classifications\n",
    "\n",
    "Run relevance classifications against a subset of the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "058106771549475aaa4fa7a2a3c5d1af",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "llm_classify |          | 0/100 (0.0%) | ⏳ 00:00<? | ?it/s"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# The rails is used to hold the output to specific values based on the template\n",
    "# It will remove text such as \",,,\" or \"...\"\n",
    "# Will ensure the binary value expected from the template is returned\n",
    "rails = list(RAG_RELEVANCY_PROMPT_RAILS_MAP.values())\n",
    "relevance_classifications = llm_classify(\n",
    "    dataframe=df_sample,\n",
    "    template=RAG_RELEVANCY_PROMPT_TEMPLATE,\n",
    "    model=model,\n",
    "    rails=rails,\n",
    "    concurrency=20,\n",
    ")[\"label\"].tolist()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Evaluate Classifications\n",
    "\n",
    "Evaluate the predictions against human-labeled ground-truth relevance labels."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "    relevant       0.77      0.87      0.82        47\n",
      "   unrelated       0.87      0.77      0.82        53\n",
      "\n",
      "    accuracy                           0.82       100\n",
      "   macro avg       0.82      0.82      0.82       100\n",
      "weighted avg       0.83      0.82      0.82       100\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'Confusion Matrix (Normalized)'}, xlabel='Predicted Classes', ylabel='Actual Classes'>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "true_labels = df_sample[\"relevant\"].map(RAG_RELEVANCY_PROMPT_RAILS_MAP).tolist()\n",
    "\n",
    "print(classification_report(true_labels, relevance_classifications, labels=rails))\n",
    "confusion_matrix = ConfusionMatrix(\n",
    "    actual_vector=true_labels, predict_vector=relevance_classifications, classes=rails\n",
    ")\n",
    "confusion_matrix.plot(\n",
    "    cmap=plt.colormaps[\"Blues\"],\n",
    "    number_label=True,\n",
    "    normalized=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Classifications with explanations\n",
    "\n",
    "When evaluating a dataset for relevance, it can be useful to know why the LLM classified a document as relevant or irrelevant. The following code block runs `llm_classify` with explanations turned on so that we can inspect why the LLM made the classification it did. There is speed tradeoff since more tokens is being generated but it can be highly informative when troubleshooting."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using prompt:\n",
      "\n",
      "\n",
      "You are comparing a reference text to a question and trying to determine if the reference text\n",
      "contains information relevant to answering the question. Here is the data:\n",
      "    [BEGIN DATA]\n",
      "    ************\n",
      "    [Question]: {input}\n",
      "    ************\n",
      "    [Reference text]: {reference}\n",
      "    ************\n",
      "    [END DATA]\n",
      "Compare the Question above to the Reference text. You must determine whether the Reference text\n",
      "contains information that can help answer the Question. First, write out in a step by step manner\n",
      "an EXPLANATION to show how to arrive at the correct answer. Avoid simply stating the correct answer\n",
      "at the outset. Your response LABEL must be single word, either \"relevant\" or \"unrelated\", and\n",
      "should not contain any text or characters aside from that word. \"unrelated\" means that the\n",
      "reference text does not help answer to the Question. \"relevant\" means the reference text directly\n",
      "answers the question.\n",
      "\n",
      "Example response:\n",
      "************\n",
      "EXPLANATION: An explanation of your reasoning for why the label is \"relevant\" or \"unrelated\"\n",
      "LABEL: \"relevant\" or \"unrelated\"\n",
      "************\n",
      "\n",
      "EXPLANATION:\n",
      "OpenAI invocation parameters: {'model': 'gpt-4', 'temperature': 0.0, 'max_tokens': 256, 'frequency_penalty': 0, 'presence_penalty': 0, 'top_p': 1, 'n': 1, 'timeout': None}\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "35aa9e114681486cb5fdc7a08c53ef19",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "llm_classify |          | 0/5 (0.0%) | ⏳ 00:00<? | ?it/s"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "- Snapped 'relevant' to rail: relevant\n",
      "- Snapped 'relevant' to rail: relevant\n",
      "- Snapped 'unrelated' to rail: unrelated\n",
      "- Snapped 'relevant' to rail: relevant\n",
      "- Snapped 'unrelated' to rail: unrelated\n"
     ]
    }
   ],
   "source": [
    "small_df_sample = df_sample.copy().sample(n=5).reset_index(drop=True)\n",
    "relevance_classifications_df = llm_classify(\n",
    "    dataframe=small_df_sample,\n",
    "    template=RAG_RELEVANCY_PROMPT_TEMPLATE,\n",
    "    model=model,\n",
    "    rails=rails,\n",
    "    provide_explanation=True,\n",
    "    verbose=True,\n",
    "    concurrency=20,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>input</th>\n",
       "      <th>reference</th>\n",
       "      <th>label</th>\n",
       "      <th>explanation</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>What did Lawrence Joshua Chamberlain do?</td>\n",
       "      <td>Joshua Lawrence Chamberlain (September 8, 1828 – February 24, 1914), born as Lawrence Joshua Chamberlain, was an American college professor from the State of Maine , who volunteered during the American Civil War to join the Union Army . Although having no earlier education in military strategies, he became a highly respected and decorated Union officer , reaching the rank of brigadier general (and brevet major general ). For his gallantry at Gettysburg , he was awarded the Medal of Honor . He was given the honor of commanding the Union troops at the surrender ceremony for the infantry of Robert E. Lee 's Army at Appomattox , Virginia. After the war, he entered politics as a Republican and served four one-year terms of office as the 32nd Governor of Maine . He served on the faculty, and as president, of his alma mater , Bowdoin College .</td>\n",
       "      <td>relevant</td>\n",
       "      <td>The question asks about what Lawrence Joshua Chamberlain did. The reference text provides a detailed account of Lawrence Joshua Chamberlain's life, including his career as a college professor, his military service during the American Civil War, his political career as the Governor of Maine, and his role at Bowdoin College. Therefore, the reference text is relevant to the question.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>what is the sign for degrees</td>\n",
       "      <td>The degree symbol (°) is a typographical symbol that is used, among other things, to represent degrees of arc (e.g. in geographic coordinate systems ), hours (in the medical field), or degrees of temperature . The symbol consists of a small raised circle, historically a zero glyph . In Unicode it is encoded at .</td>\n",
       "      <td>relevant</td>\n",
       "      <td>The question asks for the sign used for degrees. The reference text provides a detailed explanation of the degree symbol, including its appearance and uses. Therefore, the reference text is directly relevant to the question.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>how did Joan Crawford die?</td>\n",
       "      <td>Joan Crawford (March 23, ca. 1904 – May 10, 1977), born Lucille Fay LeSueur, was an American actress in film, television and theatre. Starting as a dancer in traveling theatrical companies before debuting on Broadway , Crawford was signed to a motion picture contract by Metro-Goldwyn-Mayer in 1925. Initially frustrated by the size and quality of her parts, Crawford began a campaign of self-publicity and became nationally known as a flapper by the end of the 1920s. In the 1930s, Crawford's fame rivaled, and later outlasted, MGM colleagues Norma Shearer and Greta Garbo . Crawford often played hardworking young women who find romance and financial success. These \"rags-to-riches\" stories were well received by Depression -era audiences and were popular with women. Crawford became one of Hollywood's most prominent movie stars and one of the highest paid women in the United States, but her films began losing money and by the end of the 1930s she was labeled \"box office poison\". After an absence of nearly two years from the screen, Crawford staged a comeback by starring in Mildred Pierce (1945), for which she won the Academy Award for Best Actress . In 1955, she became involved with the Pepsi-Cola Company through her marriage to company Chairman Alfred Steele . After his death in 1959, Crawford was elected to fill his vacancy on the board of directors but was forcibly retired in 1973. She continued acting in film and television regularly through the 1960s, when her performances became fewer; after the release of the British horror film Trog in 1970, Crawford retired from the screen. Following a public appearance in 1974, after which unflattering photographs were published, Crawford withdrew from public life and became increasingly reclusive until her death in 1977. Crawford married four times. Her first three marriages ended in divorce; the last ended with the death of husband Alfred Steele. She adopted five children, one of whom was reclaimed by his birth mother. Crawford's relationships with her two older children, Christina and Christopher, were acrimonious. Crawford disinherited the two and, after Crawford's death, Christina wrote a \"tell-all\" memoir, Mommie Dearest , in which she alleged a lifelong pattern of physical and emotional abuse perpetrated by Crawford. She was voted the tenth greatest female star in the history of American cinema by the American Film Institute .</td>\n",
       "      <td>unrelated</td>\n",
       "      <td>The question asks about the cause of Joan Crawford's death. The reference text mentions that Joan Crawford died in 1977, but it does not provide any information about how she died. Therefore, while the text is somewhat related to the question in that it mentions her death, it does not provide the specific information needed to answer the question.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Who Makes Nexen Tires</td>\n",
       "      <td>Nexen Tire is a tire manufacturer, headquartered in Yangsan , South Gyeongsang Province , and Seoul , both in South Korea . Its major domestic competitors are Hankook Tire and Kumho Tires . The company's name is reflected in the company slogan , \"Next Century Tire.\"</td>\n",
       "      <td>relevant</td>\n",
       "      <td>The question asks about the manufacturer of Nexen Tires. The reference text clearly states that Nexen Tire is a tire manufacturer based in South Korea. Therefore, the reference text directly answers the question.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>where is mark sanchez from</td>\n",
       "      <td>Mark Travis John Sanchez (born November 11, 1986) is an American football quarterback for the New York Jets of the National Football League (NFL). He was drafted in the first round of the 2009 NFL Draft as the fifth overall selection by the Jets and the second quarterback taken overall. He played college football at the University of Southern California (USC). Sanchez grew up in a well-disciplined and athletic family. In the eighth grade, he began to play football and learn the intricacies of the quarterback position, training with his father, Nick. A well-regarded prospect, Sanchez committed to Southern California following his successful high school career in which he led his team to a championship title during his final season. At USC, Sanchez was relegated as the backup quarterback during his first three years though he rose to prominence due to his brief appearances on the field in 2007 due to injuries suffered by starting quarterback John David Booty . Sanchez also became popular within the community due to his Mexican-American heritage. Named the starter in 2008, Sanchez led USC to a 12–1 record and won the Rose Bowl against Penn State for which Sanchez was awarded the Most Valuable Player award for his performance on offense . Although many considered him too inexperienced, Sanchez announced his intention to enter the 2009 NFL Draft . He was selected by the Jets after they traded up with the Cleveland Browns , and was named the starting quarterback prior to the start of the season . Despite a subpar performance, Sanchez led the Jets to the AFC Championship Game , a losing effort to the Indianapolis Colts , becoming the fourth rookie quarterback in NFL history to win his first playoff game and the second to win two playoff games. In his second season, Sanchez continued to develop and led the Jets to the playoffs and the team's second consecutive AFC Championship Game where they narrowly lost to the Pittsburgh Steelers , 24–19. With the win over the New England Patriots the week prior, Sanchez tied four other quarterbacks for the second most post-season road victories by a quarterback in NFL history. In leading the Jets to two consecutive conference championships, Sanchez joined quarterback Ben Roethlisberger as the only two quarterbacks in NFL history to reach the conference championship in their first two seasons in the league. The next two seasons would be a regression for both the team and Sanchez as they failed to reach the playoffs. Fans and media critics called for a struggling Sanchez to be benched. He eventually was replaced towards the end of the 2012 season with Greg McElroy .</td>\n",
       "      <td>unrelated</td>\n",
       "      <td>The question asks about the origin of Mark Sanchez. The reference text provides information about Mark Sanchez's life, including his upbringing and career. However, it does not specify where he is from, which is the information asked for in the question. Therefore, the reference text does not contain information that can help answer the question.</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                      input  \\\n",
       "0  What did Lawrence Joshua Chamberlain do?   \n",
       "1              what is the sign for degrees   \n",
       "2                how did Joan Crawford die?   \n",
       "3                     Who Makes Nexen Tires   \n",
       "4                where is mark sanchez from   \n",
       "\n",
       "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          reference  \\\n",
       "0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  Joshua Lawrence Chamberlain (September 8, 1828 – February 24, 1914), born as Lawrence Joshua Chamberlain, was an American college professor from the State of Maine , who volunteered during the American Civil War to join the Union Army . Although having no earlier education in military strategies, he became a highly respected and decorated Union officer , reaching the rank of brigadier general (and brevet major general ). For his gallantry at Gettysburg , he was awarded the Medal of Honor . He was given the honor of commanding the Union troops at the surrender ceremony for the infantry of Robert E. Lee 's Army at Appomattox , Virginia. After the war, he entered politics as a Republican and served four one-year terms of office as the 32nd Governor of Maine . He served on the faculty, and as president, of his alma mater , Bowdoin College .   \n",
       "1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         The degree symbol (°) is a typographical symbol that is used, among other things, to represent degrees of arc (e.g. in geographic coordinate systems ), hours (in the medical field), or degrees of temperature . The symbol consists of a small raised circle, historically a zero glyph . In Unicode it is encoded at .   \n",
       "2                                                                                                                                                                                                                                       Joan Crawford (March 23, ca. 1904 – May 10, 1977), born Lucille Fay LeSueur, was an American actress in film, television and theatre. Starting as a dancer in traveling theatrical companies before debuting on Broadway , Crawford was signed to a motion picture contract by Metro-Goldwyn-Mayer in 1925. Initially frustrated by the size and quality of her parts, Crawford began a campaign of self-publicity and became nationally known as a flapper by the end of the 1920s. In the 1930s, Crawford's fame rivaled, and later outlasted, MGM colleagues Norma Shearer and Greta Garbo . Crawford often played hardworking young women who find romance and financial success. These \"rags-to-riches\" stories were well received by Depression -era audiences and were popular with women. Crawford became one of Hollywood's most prominent movie stars and one of the highest paid women in the United States, but her films began losing money and by the end of the 1930s she was labeled \"box office poison\". After an absence of nearly two years from the screen, Crawford staged a comeback by starring in Mildred Pierce (1945), for which she won the Academy Award for Best Actress . In 1955, she became involved with the Pepsi-Cola Company through her marriage to company Chairman Alfred Steele . After his death in 1959, Crawford was elected to fill his vacancy on the board of directors but was forcibly retired in 1973. She continued acting in film and television regularly through the 1960s, when her performances became fewer; after the release of the British horror film Trog in 1970, Crawford retired from the screen. Following a public appearance in 1974, after which unflattering photographs were published, Crawford withdrew from public life and became increasingly reclusive until her death in 1977. Crawford married four times. Her first three marriages ended in divorce; the last ended with the death of husband Alfred Steele. She adopted five children, one of whom was reclaimed by his birth mother. Crawford's relationships with her two older children, Christina and Christopher, were acrimonious. Crawford disinherited the two and, after Crawford's death, Christina wrote a \"tell-all\" memoir, Mommie Dearest , in which she alleged a lifelong pattern of physical and emotional abuse perpetrated by Crawford. She was voted the tenth greatest female star in the history of American cinema by the American Film Institute .   \n",
       "3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Nexen Tire is a tire manufacturer, headquartered in Yangsan , South Gyeongsang Province , and Seoul , both in South Korea . Its major domestic competitors are Hankook Tire and Kumho Tires . The company's name is reflected in the company slogan , \"Next Century Tire.\"   \n",
       "4  Mark Travis John Sanchez (born November 11, 1986) is an American football quarterback for the New York Jets of the National Football League (NFL). He was drafted in the first round of the 2009 NFL Draft as the fifth overall selection by the Jets and the second quarterback taken overall. He played college football at the University of Southern California (USC). Sanchez grew up in a well-disciplined and athletic family. In the eighth grade, he began to play football and learn the intricacies of the quarterback position, training with his father, Nick. A well-regarded prospect, Sanchez committed to Southern California following his successful high school career in which he led his team to a championship title during his final season. At USC, Sanchez was relegated as the backup quarterback during his first three years though he rose to prominence due to his brief appearances on the field in 2007 due to injuries suffered by starting quarterback John David Booty . Sanchez also became popular within the community due to his Mexican-American heritage. Named the starter in 2008, Sanchez led USC to a 12–1 record and won the Rose Bowl against Penn State for which Sanchez was awarded the Most Valuable Player award for his performance on offense . Although many considered him too inexperienced, Sanchez announced his intention to enter the 2009 NFL Draft . He was selected by the Jets after they traded up with the Cleveland Browns , and was named the starting quarterback prior to the start of the season . Despite a subpar performance, Sanchez led the Jets to the AFC Championship Game , a losing effort to the Indianapolis Colts , becoming the fourth rookie quarterback in NFL history to win his first playoff game and the second to win two playoff games. In his second season, Sanchez continued to develop and led the Jets to the playoffs and the team's second consecutive AFC Championship Game where they narrowly lost to the Pittsburgh Steelers , 24–19. With the win over the New England Patriots the week prior, Sanchez tied four other quarterbacks for the second most post-season road victories by a quarterback in NFL history. In leading the Jets to two consecutive conference championships, Sanchez joined quarterback Ben Roethlisberger as the only two quarterbacks in NFL history to reach the conference championship in their first two seasons in the league. The next two seasons would be a regression for both the team and Sanchez as they failed to reach the playoffs. Fans and media critics called for a struggling Sanchez to be benched. He eventually was replaced towards the end of the 2012 season with Greg McElroy .   \n",
       "\n",
       "       label  \\\n",
       "0   relevant   \n",
       "1   relevant   \n",
       "2  unrelated   \n",
       "3   relevant   \n",
       "4  unrelated   \n",
       "\n",
       "                                                                                                                                                                                                                                                                                                                                                                                       explanation  \n",
       "0  The question asks about what Lawrence Joshua Chamberlain did. The reference text provides a detailed account of Lawrence Joshua Chamberlain's life, including his career as a college professor, his military service during the American Civil War, his political career as the Governor of Maine, and his role at Bowdoin College. Therefore, the reference text is relevant to the question.  \n",
       "1                                                                                                                                                                 The question asks for the sign used for degrees. The reference text provides a detailed explanation of the degree symbol, including its appearance and uses. Therefore, the reference text is directly relevant to the question.  \n",
       "2                                    The question asks about the cause of Joan Crawford's death. The reference text mentions that Joan Crawford died in 1977, but it does not provide any information about how she died. Therefore, while the text is somewhat related to the question in that it mentions her death, it does not provide the specific information needed to answer the question.  \n",
       "3                                                                                                                                                                             The question asks about the manufacturer of Nexen Tires. The reference text clearly states that Nexen Tire is a tire manufacturer based in South Korea. Therefore, the reference text directly answers the question.  \n",
       "4                                     The question asks about the origin of Mark Sanchez. The reference text provides information about Mark Sanchez's life, including his upbringing and career. However, it does not specify where he is from, which is the information asked for in the question. Therefore, the reference text does not contain information that can help answer the question.  "
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Let's view the data\n",
    "merged_df = pd.merge(\n",
    "    small_df_sample, relevance_classifications_df, left_index=True, right_index=True\n",
    ")\n",
    "merged_df[[\"input\", \"reference\", \"label\", \"explanation\"]].head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LLM Evals: relevance Classifications GPT-3.5 Turbo\n",
    "Run relevance against a subset of the data using GPT-3.5. GPT-3.5 can significantly speed up the classification process. However there are tradeoffs as  we will see below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The `model_name` field is deprecated. Use `model` instead.                 This will be removed in a future release.\n"
     ]
    }
   ],
   "source": [
    "model = OpenAIModel(model=\"gpt-3.5-turbo\", temperature=0.0, request_timeout=20)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2d083b07d0e449ccb1f9df27184c3c56",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "llm_classify |          | 0/100 (0.0%) | ⏳ 00:00<? | ?it/s"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Exception in worker on attempt 1: raised APITimeoutError('Request timed out.')\n",
      "Requeuing...\n"
     ]
    }
   ],
   "source": [
    "rails = list(RAG_RELEVANCY_PROMPT_RAILS_MAP.values())\n",
    "relevance_classifications = llm_classify(\n",
    "    dataframe=df_sample,\n",
    "    template=RAG_RELEVANCY_PROMPT_TEMPLATE,\n",
    "    model=model,\n",
    "    rails=rails,\n",
    "    concurrency=20,\n",
    ")[\"label\"].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "    relevant       0.50      1.00      0.67        47\n",
      "   unrelated       1.00      0.11      0.20        53\n",
      "\n",
      "    accuracy                           0.53       100\n",
      "   macro avg       0.75      0.56      0.44       100\n",
      "weighted avg       0.77      0.53      0.42       100\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'Confusion Matrix (Normalized)'}, xlabel='Predicted Classes', ylabel='Actual Classes'>"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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I7Zv346JEycqdV4mMERERFRm58+fh4uLC1xcXAAAAQEBcHFxQWBgIAAgMTFRlswAQMOGDREeHo4jR47AyckJixYtwpo1a+Dl5aXUeTmEREREpE5EonIOISnXtmPHjijplnKK7rLbsWNHXLp0SdnI5DCBISIiUidlGAYq0l4FqEaURERERK9gDwwREZE6ectDSFWFCQwREZFaKecQkooMzqhGlERERESvYA8MERGROuEQEhEREakcrkIiIiIiqp7YA0NERKROOIREREREKqeGDCExgSEiIlInNaQHRjXSLCIiIqJXsAeGiIhInXAIiYiIiFSOSFTOBIZDSERERESVgj0wRERE6kQsKtjK014FMIEhIiJSJzVkDoxqRElERET0CvbAEBERqZMach8YJjBERETqhENIRERERNUTe2CIiIjUCYeQiIiISOXUkCEkJjBERETqpIb0wKhGmkVERET0CvbAEBERqRMOIREREZHK4RASERERUfXEHhgiIiK1Us4hJBXp22ACQ0REpE44hERERERUPbEHhoiISJ2IROVchaQaPTBMYIiIiNRJDVlGrRpREhEREb2CPTBERETqpIZM4mUCQ0REpE5qyBASExgiIiJ1UkN6YFQjzSIiIiJ6BXtgiIiI1AmHkIiIiEjlcAiJiIiIqHpiDwwREZEaEYlEENWAHhgmMERERGqkpiQwHEIiIiIilcMeGCIiInUi+ncrT3sVwASGiIhIjXAIiYiIiKiaYg8MERGRGqkpPTBMYIiIiNQIExgiIiJSOTUlgeEcGCIiIlI57IEhIiJSJ1xGTURERKqGQ0hERERE1RR7YIiIiNSISIRy9sBUXCyViQkMERGRGhGhnENIKpLBcAiJiIiIVA57YIiIiNRITZnEywSGiIhIndSQZdQcQiIiIiKVwx4YIiIidVLOISSBQ0hERET0tpV3Dkz5VjC9PUxgiIiI1EhNSWA4B4aIiIjKbcWKFbCzs4OOjg7c3Nxw9uzZEuuHhYWhWbNm0NXVhY2NDSZOnIjnz5+X+nxMYIiIiNSJqAI2JW3btg0BAQEICgrCxYsX4eTkBC8vL6SkpCisv3nzZnz99dcICgrCrVu38Msvv2Dbtm345ptvSn1OJjBERERqpHAIqTybshYvXoyRI0di+PDhcHBwwKpVq6Cnp4e1a9cqrH/69Gm0a9cOgwYNgp2dHbp1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OzB16tQKD5CIiIhKr6ZM4lU6gYmJiYGzszMAYMeOHejQoQM2b96MdevWYdeuXRUdHxEREVERSs+BEQQBUqkUQMEy6l69egEouClNWlpaxUZHREREShH9u5WnvSpQOoFp06YN5s2bB09PT5w4cQIrV64EUHCDu9cfpU1ERERvV3lXEqnKKiSlh5DCwsJw8eJFjB07FjNmzECTJk0AADt37sT7779f4QESERERvU7pHphWrVrJrUIqtHDhQrnHYhMREdHbJxYVbOVprwqUTmCKo6OjU1GHIiIiojKqKUNISicwEokES5Yswfbt25GQkFDk3i+PHz+usOCIiIiIFFF6Dszs2bOxePFiDBgwABkZGQgICEDfvn0hFosRHBxcCSESERGRMtT9JnZAGRKYTZs2YfXq1Zg0aRJq1aoFX19frFmzBoGBgeV6LDYRERGVX015FpLSCUxSUhIcHR0BAAYGBsjIyAAA9OrVC+Hh4RUbHRERESmlcBJveTZVoHQCU79+fSQmJgIAGjdujMOHDwMAzp07B21t7YqNjoiIiEgBpROYPn36IDIyEgDw1VdfYdasWbC3t8ewYcPw6aefVniAREREVHo1ZQhJ6VVI8+fPl309YMAANGjQANHR0bC3t4e3t3eFBkdERETK4aMESsnd3R3u7u4VEQsRERFRqZQqgdm3b1+pD/jRRx+VORgiIiIqH7FIBHE5hoHK0/ZtKlUC4+PjU6qDiUQiSCSS8sRDRERE5VDe+7moSP5SugRGKpVWdhxEREREpVZhz0IiIiKiqldTnoVU6mXUx44dg4ODAzIzM4vsy8jIwDvvvIOTJ09WaHBERESknPI8RkCVHidQ6gQmLCwMI0eOhJGRUZF9xsbGGD16NJYsWVKhwREREREpUuoE5sqVK+jevXux+7t164YLFy5USFBERERUNoWrkMqzqYJSz4FJTk6GpqZm8QeqVQupqakVEhQRERGVTU1ZhVTqHhhra2tcv3692P1Xr16FpaVlhQRFREREZVNTHiVQ6gSmR48emDVrFp4/f15k37NnzxAUFIRevXpVaHBEREREipR6CGnmzJnYvXs3mjZtirFjx6JZs2YAgNu3b2PFihWQSCSYMWNGpQVKAKyaA5q6VR0FUaVIySj6xxGRusjKenufbzHK8KTm19qrglInMObm5jh9+jS++OILTJ8+HYIgACjo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IiIiojISowx3qX2tvSoodZx//vknsrKy4OrqCjc3N/zwww9IS0urzNiIiIiIFCp1AvPee+9h9erVSExMxOjRo7F161ZYWVlBKpXiyJEjyMrKqsw4iYiIqBREIlG5N1WgdE+Rvr4+Pv30U/z555+4du0aJk2ahPnz56NevXr46KOPKiNGIiIiKiVRBWyqoFxDXc2aNcOCBQvw999/Y8uWLRUVExEREZVR4Z14y7OpggqZq6OhoQEfHx/s27evIg5HREREVKJy34mXiIiIqhfV6EMpHyYwREREaqQqHiVQFVRluTcRERGRDHtgiIiI1Eh5l0KryjJqJjBERERqhHfiJSIiIqqm2ANDRESkRjiERERERCqnvHfTVY30hUNIREREpILYA0NERKRGOIREREREKqemrEJiAkNERKRGakoPjKokWkREREQy7IEhIiJSIzVlFRITGCIiIjXChzkSERERVVPsgSEiIlIjYoggLsdAUHnavk1MYIiIiNQIh5CIiIiIqin2wBAREakR0b//lae9KmACQ0REpEY4hERERERUTbEHhoiISI2IyrkKiUNIRERE9NbVlCEkJjBERERqpKYkMJwDQ0RERCqHPTBERERqhMuoiYiISOWIRQVbedqrAg4hERERkcphDwwREZEa4RASERERqRyuQiIiIiKqptgDQ0REpEZEKN8wkIp0wDCBISIiUidchURERERUTdXIHpioqCh06tQJT548gYmJyVs/f8eOHeHs7IywsLC3fm518NmH7+ArH2fUM9HD9fh0TFvzJy7eTSm2/ue9WuHT7u+gvqkBHmc9x++nYzFn4xnkvZAAAMRiEb4e0Ab9PZqinokekp7kYPOxO/h+xwW54zStb4Lgoe5o944lNDTEuPPwCfwWHMLfadmwMTPE1Z+HKDy//8JD+P30fQBAB0drzBjUFi1s6yD3+UtsPX4HczedgUQqVNC7Q+pg0++n8Mv2KKQ+zkLzxpaYNbYPWjVvoLDu3fgkLFt3CDfu/o1HyU8w/YuP4P9xB7k6567G4pftUbh+9xFS0zOxYrY/PNu1lKuzfP0hhEddRlLqU2jWqoV37Otj4qfd4dTCFgDwd9Jj/LjxKP66fBdpj7NQr64xPvJsjc8HdYGWZsGvkrz8FwgK24UbMX8jNiEFHd9rgR/nDK+Ed4hKwlVIJIdJR/XQp11jzBveDgGr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1EjhKqTybMratm0bAgICEBQUhIsXL8LJyQleXl5ISUlRWD8qKgq+vr44fvw4oqOjYWNjg27duuHRo0elPicTGCIiIiqXxYsXY+TIkRg+fDgcHBywatUq6OnpYe3atQrrb9q0CV9++SWcnZ3RvHlzrFmzBlKpFJGRkaU+JxMYIiIiNSKqgA0oeLbSq1teXp7C8+Xn5+PChQvw9PSUlYnFYnh6eiI6OrpUMefm5uLFixeoU6dOqa+TCQwREZE6qaAMxsbGBsbGxrItNDRU4enS0tIgkUhgbm4uV25ubo6kpKRShTxt2jRYWVnJJUFvwmXUREREVMTDhw/lnkatra1dKeeZP38+tm7diqioKOjo6JS6HRMYIiIiNVJRz0IyMjKSS2CKY2pqCg0NDSQnJ8uVJycnw8LCosS233//PebPn4+jR4+iVatWSsXJISQiIiI18rZXIWlpacHV1VVuAm7hhFx3d/di2y1YsABz585FREQE2rRpo/R1sgeGiIhIjVTFjXgDAgLg5+eHNm3aoG3btggLC0NOTg6GDx8OABg2bBisra1l82i+++47BAYGYvPmzbCzs5PNlTEwMICBgUGpzskEhoiIiMplwIABSE1NRWBgIJKSkuDs7IyIiAjZxN6EhASIxf8N+qxcuRL5+fno16+f3HGCgoIQHBxcqnMygSEiIlInVfQspLFjx2Ls2LEK90VFRcm9jo+PL9tJXsEEhoiISI1U1CTe6o6TeImIiEjlsAeGiIhIjZT1eUavtlcFTGCIiIjUSBVNgXnrOIREREREKoc9MEREROqkhnTBMIEhIiJSI1yFRERERFRNsQeGiIhIjXAVEhEREamcGjIFhgkMERGRWqkhGQznwBAREZHKYQ8MERGRGqkpq5CYwBAREamTck7iVZH8hUNIREREpHrYA0NERKRGasgcXiYwREREaqWGZDAcQiIiIiKVwx4YIiIiNcJVSERERKRyasqjBDiERERERCqHPTBERERqpIbM4WUCQ0REpFZqSAbDBIaIiEiN1JRJvJwDQ0RERCqHPTBERERqRIRyrkKqsEgqFxMYIiIiNVJDpsBwCImIiIhUD3tgiIiI1EhNuZEdExgiIiK1UjMGkTiERERERCqHPTBERERqhENIREREpHJqxgASh5CIiIhIBbEHhoiISI1wCImIiIhUTk15FhITGCIiInVSQybB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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "true_labels = df_sample[\"relevant\"].map(RAG_RELEVANCY_PROMPT_RAILS_MAP).tolist()\n",
    "\n",
    "print(classification_report(true_labels, relevance_classifications, labels=rails))\n",
    "confusion_matrix = ConfusionMatrix(\n",
    "    actual_vector=true_labels, predict_vector=relevance_classifications, classes=rails\n",
    ")\n",
    "confusion_matrix.plot(\n",
    "    cmap=plt.colormaps[\"Blues\"],\n",
    "    number_label=True,\n",
    "    normalized=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Preview: Running with GPT-4 Turbo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The `model_name` field is deprecated. Use `model` instead.                 This will be removed in a future release.\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "4a017b45b2794c689eed81f9c6dc2ee2",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "llm_classify |          | 0/100 (0.0%) | ⏳ 00:00<? | ?it/s"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = OpenAIModel(model_name=\"gpt-4-turbo-preview\")\n",
    "relevance_classifications = llm_classify(\n",
    "    dataframe=df_sample,\n",
    "    template=RAG_RELEVANCY_PROMPT_TEMPLATE,\n",
    "    model=model,\n",
    "    rails=list(RAG_RELEVANCY_PROMPT_RAILS_MAP.values()),\n",
    "    concurrency=20,\n",
    ")[\"label\"].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "    relevant       0.75      0.94      0.83        47\n",
      "   unrelated       0.93      0.72      0.81        53\n",
      "\n",
      "    accuracy                           0.82       100\n",
      "   macro avg       0.84      0.83      0.82       100\n",
      "weighted avg       0.84      0.82      0.82       100\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'Confusion Matrix (Normalized)'}, xlabel='Predicted Classes', ylabel='Actual Classes'>"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "true_labels = df_sample[\"relevant\"].map(RAG_RELEVANCY_PROMPT_RAILS_MAP).tolist()\n",
    "\n",
    "print(classification_report(true_labels, relevance_classifications, labels=rails))\n",
    "confusion_matrix = ConfusionMatrix(\n",
    "    actual_vector=true_labels, predict_vector=relevance_classifications, classes=rails\n",
    ")\n",
    "confusion_matrix.plot(\n",
    "    cmap=plt.colormaps[\"Blues\"],\n",
    "    number_label=True,\n",
    "    normalized=True,\n",
    ")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
